psz_subtitle 調査
https://gyazo.com/3ddf8ecd89acb4f2a97bce1febbda701
あまりに難解で厳しい ヘッダファイルがうまくリンクできてないからジャンプできないし
該当のログを出力している場所
参照渡しがされすぎていてジャンプできないGitHub上だとよくわからないが、arib_parser_get_dataの返り値のpsz_dataがhexとして出力されていそう
arib_parser_tのstructからpsz_subtitle_dataが取り出され返されている
aribsub.cのstatic subpicture_t *renderがどこから呼び出されているのか…
色々調べたけどかなりわからなかった
psz_subtitle_dataとして渡されている部分
データはちょうどparseTextに渡る部分
これのみではDRCSデータなどが不足しているので正常に描画されないパターンが出てくる
デコード関数
aribb24jsの対応部分
調査結果
psz_subtitle_dataから読み取れるデータがおそらくpriv_data生ではない
文字列データが入っていることは確認できたが、どこからどこまで…?
aribb24jsのCRC・purpose_data_identifer・purpose_data_group_id等が全てアンマッチで中断されるのでデータとして微妙な状態になっていそう
pesも不明だし(とりあえず0固定している)
まあstartTimeとしか使われていない?っぽいので大丈夫そう
強制的に中断を回避してデータ長だけparseTextすると読み取れる
https://gyazo.com/5c98105e9a9bce4d9186b8f77c242d2f
文字色・位置情報等は入っていることが確認できる
参考データ 0c 9b 36 32 30 3b 34 38 30 20 56 9b 31 37 30 3b 33 30 20 5f 9b 34 20 58 9b 32 34 20 59 9b 33 36 3b 33 36 20 57 1d 61 89 1c 46 43 8a 83 90 20 44 90 51 bd a6 cd 89 fa 21 21 8a 3b 33 46 62 3c 2b 42 4e e2 1c 47 42 1b 7e cb b9 1b 7d cb ca c3 c6 ad c6 de b9 cd 89 fa
データ構造がわかれば擬似的に復元はできそうだが…?
priv_data_arrivedでふってくるデータとvlcが吐き出すログ出力を見比べたいが、hls視聴環境手元にないんだよな〜
そもそもデコーダーをオンにすると映像に字幕が埋め込まれちゃうので、うまく上から字幕をかぶせられたとしても二重字幕になる
delayいじっても消えたりしなかったので、opacityを0にできるような変更が必要そう
Electronと一緒にnodeのサーバ立ち上げてそっちで受信してdemux、再配信したほうが確実にデータ抜けそうではある
変更を加えてみる
自家製VLCにて素のVLCをビルドできたので、これに変更を加えてみる aribsub.cに変更を加える内容のパッチを.patchとしてpatchesに置く
renderをスキップ、その前でarib_dataとしてbase64 encodedのpriv_dataをmsg_Dbgで出力
https://gyazo.com/49170bd953f73d9f28b21e1481436002
ptsが取れてないので(一緒にとれるのかな?)とりあえず2秒ぐらい先でrenderしているが(EndTimeも考慮できてない)とりあえず表示ができた
Videoを使ってないのでCanvasRendererを自前で実装しているが、同じくCueも使えないのでタイムライン管理も自前でやる必要がありそうな気がするぞ…
https://gyazo.com/50f42c391e575c06f755b4deaa4ba417
ptsとれそう
%gで取り出したら6.95327e-310になっちゃった
webchimera.player.timeは単純に再生開始からのmsだった…
int64_tで43_581_973_467, 43_582_106_934...
どこからの値なんだ
https://gyazo.com/1dee3ebff2988c240302123ac0b9ddfa
差分
適当にmdate()かなあと思ってmdate()分引いてみたら-229_117_724_236になっちゃったし(pts: 50423768678)
arib_data [gP/wAAAAAAo/ARpqcG6AAAAAsHg=][49256999656][310562220616][1]
@_monyone さん: 49256999656 は 49256999656 * 9 / 100 で 1083C31F1(1083C31F1) になるので、PTS がマイクロ秒に変換されて入っていそうですね。ただ、PTS は33bitで26.5時間で巡回するので、time の計算時には巡回を考慮してますね。やっぱり time で pcr.i_first を見ないようにした方が、つじつま取れるかも...?
pcr.i_firstを見ないべきtimeを探す旅に出ています
aribsubからそもそもoffsetが引けないの、かなり泣けるな…
もしかして任意桁で情報もち分けるuuidみたいな感じなのか?謎は深まる
mtime_t、結局ただのint64_tなので何でも持ってよくて困るな
VLC_TS_0とかいうマクロが怪しい気がしてきた
1でした…
VLC v4とv3ガチで紛らわしい、3系統がメインストリームで4系統がdevっぽいけど…
arib_data [gP/whAAAADc/AAAzHyAAAAEMHyAAACibNyBTmzYyMDs0ODAgVpsxNzA7MzAgX5s0IFibMjQgWZszNjszNiBXXtM=][33599308401][3023937756][327629148848]
table:pts
33599308401 i_pts
3023937756 TO_SCALE(i_pts)
327629148848 mdate()
3006679833 i_pcr 間違ってp_pmt->pcr.i_first == -1のときだけmsg_Dbgしてしまった
310_562_220_616 - 229_117_724_236 = 81_444_496_380
mdate() + (toscaled - mdate())でそれっぽい値が出ていた気がしたけど完全に気のせいだった
arib_data [gP/wgAAAAAo/ARpqcG6AAAAA5Go=][34088447067][3067960235][328118339554]
code:pcr
i_pcr 1053906415, pcr_i_first 1053313038
table:pcr
11710843845 i_pts
1053975945 TO_SCALE(i_pts)
341543806739 mdate()
30738942606 TO_SCALE(mdate())
1053906415 i_pcr
1053313038 pcr_i_first
(1053975945 - 1053906415)/90000 = 0.7725555555555556 ~= 0.7秒
とりあえずi_pcrとTO_SCALE(i_pts)の差分を見る形で実装します ありがとうございます
う〜〜〜ん 今まで2000msで大体上手く出てたので0.7秒だと普通にずれるな
提案手法はi_firstだった!基準時間どうしたらいいんだろう
(TO_SCALE(i_pts) - i_pcr)/90000で再生開始からの時間、(TO_SCALE(i_pts) - pcr_i_first)/900000で再生開始からのフレーム表示相対時間か
mtime_to_tsとmdate_tick()という気になる関数があるが、ヘッダファイルがなくて呼び出せないし、呼び出し箇所がなくて真似できない まあ実装を見るにそこまでのことはしてなさそう
どうせならaribsub.Decodeの引数にi_pcr入れちゃって一元的に取りたい気もするけど呼び出し方がよくわからない、今度追加調査 #todo PTSの計算方法を問うスレッド、ろくな返信もらえず終わってるのマジで悲しい なんなん
https://gyazo.com/842a7a1a411f490f3bbcdfa592100ccf
いけたっぽい!!!!!絶対時間とplayer.timeをすり合わせたらできました
https://gyazo.com/80dba1e3d42ca5e63d42227def5b6227
嘘です めちゃめちゃすぎて苦しい!!!!!
https://gyazo.com/eef748f71108786bd3d865ee2d938b5f
Endtimeが9007199254740991(多分Inifinity)の場合は次の字幕が来るまでの表示、具体的な指定がある場合はその時点で消滅させなければならない?
@_monyone さん: endTime は Infinity だと VTTCue に入れられないので SAFE_MAX_INTERGER にしています。
時刻に関しては、PTS が内部の時刻のような気が...? webchimera の time と対応していれば一番良いですね..
どう実装したものか
ちなみにVLCのビルドは2時間程度かかるので、pushしてから成果物が確認できるまでかなり待ちがあり、1日にできる試行も割と少ないのが難しいところ
字幕を表示しているのはlibaribsub_plugin.dylib
tsをdemuxしているのはlibts_plugin.dylib
このリプライツリーにてかなりご協力いただいています(あとからpsz_subtitle調べにきた人がもしいたら)
https://gyazo.com/5d1f25409888403fcaba38a8b8ef517a
CIが狂って普段は1時間半のビルドが3時間経過しても終わらない図です
https://gyazo.com/d224df988d88478ba54dc37cb7d390c0
4時間6分、狂っている
字幕消失
https://gyazo.com/3d173c079d8f671fc55150b34c30fc05
https://gyazo.com/136216edebd21df8f1167ed5e094daef
生放送で空白字幕でのリセットが効いていない感じがする、renderにgP/wBAAAAEE/AAA9HyAAAAEAHyAAADIMmzcgU5s2MjA7NDgwIFabMTcwOzMwIF+bNCBYmzI0IFmbMzY7MzYgV5sxOzAwMDAgY7Voが渡っているはずなのに消えていないのはなぜか
字幕キャプチャ用の保存では消えている、うーん
https://gyazo.com/7346cc636c0eda38dcd601c108383cf7
きちんとestimateも計算されているのでrenderは走っている
手元の素のhtmlで書いたやつではきちんと上書きされたので手元の実装がどこかが悪い
バグだったらしいです!修正連絡いただきました、ありがとうございました
https://gyazo.com/bc2c6afa4653ea9b93fd71cb5aad216b
消す時に遠回りしてみた、やっぱり消えない…
素htmlとこれで何が違うんだろ
https://gyazo.com/e872c969e0720a6117ddc03a9bad3597
消す代わりに適当な字幕を入れたらそれは描画される、webpackバンドルで無の場合のみスキップされてしまう?
そんなバカな…
だらだら調べてたら生放送が終わってしまった
よく考えたらrender前にとりあえずclearしておけばいいことに気づいた なるほど
描画されない文字
gP/wBAAAAG0/AABpHyAAAAEMHyAAAF6bNyBTmzYyMDs0ODAgVpsxNzA7MzAgX5s0IFibMjQgWZszNjszNiBXmzE7MDAwMCBjiJsyMzA7Mzg5IGGKkCBEkFF9e4kjMSM2ikZ8JCskaUVsNX4kRyQiJGskTiRHNvY=
後から余裕があれば調査
https://gyazo.com/8950a950933158dcdb933407db180cf8
おそらく電話の絵文字への置換?
gaijiFontでRounded M+ 1m for ARIBを適用してみるも関係なかった(Xは小さくなった)
関係あって、指定ミス
"Rounded M+ 1m for ARIB"としなければならなかった
@_monyoneさん: 描画されない文字については、93-91 (区画) は仕様上 E2FB であるので、それを尊重して私用領域で出しています。(TVRemotePlus さんの要望) 和田研ARIBフォントでは表示出来る事を確認しています。
フォント指定ミスってただけだった
https://gyazo.com/13f24aba0e4f677c7580c7b787941f95
余談
VLC for iOS、arib字幕が検出されるものの有効化してもうんともすんとも言わないのが気になっている
このページ、本当に時系列に雑に試行のダンプをしていったから本当にめちゃめちゃになってしまった
少し整理したけどこれはもう手がつけられません vlcに字幕出力させたいっすみたいな経緯で後から読みたい人がいれば(いるか?)頑張って読んでください
下文字 gP/wBAAAAcI/AAG+HyAAAAEMHzAAAUwBQSEBAQIkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////AAAAAP//////AAAAAP//////AAAAAP//////AAAAAP//////AAAAAP//////AAAAAAAAAA//AAAAAAAAAA//AAAAAAAAAA//AAAAAAAAAA//AAAAAAAAAA//AAAAAAAAAA//AAAAAAAA//////AAAAAA//////AAAAAA//////AAAAAA//////AAAAAAD////wAAAAAAD////wAAAAAAAP//8AAAAAAAAP//8AAAAAAAAA//AAAAAAAAAA//AAAAAAAAAADwAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8gAABZmzcgU5s2MjA7NDgwIFabMTcwOzMwIF+bNCBYmzI0IFmbMzY7MzYgV5sxOzAwMDAgY5szMzA7MzI5IGGJkCBEkFEhY4o6IzJzJE+JIIo8KyRpGyogQaGJIWQfIAAABJ0gWAygUg==